package com.aat.dxfy.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Test01 {
	private static Logger log = LoggerFactory.getLogger(Test01.class);
	public static void main(String[] args) {
		//1.加载shiro安全管理
		Factory<SecurityManager> fac=new IniSecurityManagerFactory("classpath:shiro.ini");
		//2.安全管理开始创建
		SecurityManager securityManager=fac.getInstance();
		//3.安全工具里放入安全管理器
		SecurityUtils.setSecurityManager(securityManager);
		//4.安全工具取得用户或者当前的执行者
		Subject currentUser = SecurityUtils.getSubject();
		//5.给他一个会话
		Session session=currentUser.getSession();
		session.setAttribute("key", "Value");
		//6.当前用户有没有被验证是可用的，如果没有证明或者验证 ，用户密码器执行登录验证
		if(!currentUser.isAuthenticated()){
			UsernamePasswordToken token =new UsernamePasswordToken("admin", "123456");
			token.setRememberMe(true);
			//currentUser.login(token);
			//7.如果登录失败了？异常会提示什么原因
			try{
				currentUser.login(token);
			}catch (UnknownAccountException e) {
				log.info("没有这个用户！");
			}catch (IncorrectCredentialsException e) {
				log.info("密码错误！");
			}catch (LockedAccountException e) {
				log.info("账户被锁定！");
			}catch (AuthenticationException e) {
				log.info("未知的原因！");
			}
			log.info("User ["+currentUser.getPrincipal()+"] logined in successfully.");
			//8.测试角色
			if(currentUser.hasRole("schwartz")){
				log.info("拥有schwartz角色");
			}else{
				log.info("对不起，没有角色。");
			}
			//9,测试权限
			if(currentUser.isPermitted("lightsaber:world")){
				log.info("你有看世界的权限.");
			}else{
				log.info("对不起,没有权限。");
			}
			//10.我们可以执行极其强大的实例级权限检查——判断用户是否有能力访问某一类型的特定实例的能力
			if(currentUser.isPermitted("winnebago:drive:eagle5")){
				log.info("你拥有特定的权限.");
			}else{
				log.info("对不起,没有特定权限。");
			}
			if(currentUser.isPermitted("app:read")){
				log.info("你拥有特定的权限哦.");
			}else{
				log.info("对不起,没有特定权限哦。");
			}
			//11.用户完事后，注销
			currentUser.logout();
		}
		
		System.exit(0);
	}
}
